package com.wjh.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 日期工具类
 * @author zsq
 */
public class DateUtil {

    public static final String formatPattern = "yyyy-MM-dd HH:mm:ss";


    public static final String formatPattern2 = "HH:mm:ss";

    public static final String formatPattern3 = "yyyy-MM-dd";

    public static final String formatPattern4 = "yyyy-MM-dd HH:mm";

    public static final String formatPattern5 = "HH:mm";


    /**
     * 避免高并发下，多线程引发的时间错误，报错问题，SimpleDateFormat是线程不安全的
     */
    public static ThreadLocal<DateFormat> DATE_FORMAT = new ThreadLocal<DateFormat>(){
        @Override
        protected DateFormat initialValue() {
            return new SimpleDateFormat(formatPattern);
        }
    };

    /**
     * 避免高并发下，多线程引发的时间错误，报错问题，SimpleDateFormat是线程不安全的
     */
    public static ThreadLocal<DateFormat> DATE_FORMAT_3 = new ThreadLocal<DateFormat>(){
        @Override
        protected DateFormat initialValue() {
            return new SimpleDateFormat(formatPattern3);
        }
    };

    /**
     * 避免高并发下，多线程引发的时间错误，报错问题，SimpleDateFormat是线程不安全的
     */
    public static ThreadLocal<DateFormat> DATE_FORMAT_4 = new ThreadLocal<DateFormat>(){
        @Override
        protected DateFormat initialValue() {
            return new SimpleDateFormat(formatPattern4);
        }
    };

    /**
     * 避免高并发下，多线程引发的时间错误，报错问题，SimpleDateFormat是线程不安全的
     */
    public static ThreadLocal<DateFormat> DATE_FORMAT_5 = new ThreadLocal<DateFormat>(){
        @Override
        protected DateFormat initialValue() {
            return new SimpleDateFormat(formatPattern5);
        }
    };

    /**
     * 获取当前时间字符串
     * @return
     */
    public static String getNowTimeStr(){
        Date nowTime = Calendar.getInstance().getTime();
        String nowTimeStr = DATE_FORMAT.get().format(nowTime);
        return nowTimeStr;
    }

    /**
     * 格式化日期对象
     * @param time
     * @return
     */
    public static String format(Date time){
        return format(time, formatPattern);
    }

    /**
     * 格式化日期对象
     * @param time
     * @param pattern
     * @return
     */
    public static String format(Date time, String pattern){
        DateFormat dateFormat = new SimpleDateFormat(pattern);
        String str = dateFormat.format(time);
        return str;
    }

    /**
     * 格式化日期对象
     * @param time
     * @return
     */
    public static String format(Date time, DateFormat dateFormat){
        String str = dateFormat.format(time);
        return str;
    }

    /**
     * 字符串转日期对象
     * @param timeStr
     * @param pattern
     * @return
     */
    public static Date parseDate(String timeStr, String pattern) throws ParseException {
        DateFormat dateFormat = new SimpleDateFormat(pattern);
        Date parseDate =  dateFormat.parse(timeStr);
        return parseDate;
    }

    /**
     * 字符串转日期对象
     * @param timeStr
     * @param dateFormat
     * @return
     */
    public static Date parseDate(String timeStr, DateFormat dateFormat) throws ParseException {
        Date parseDate = dateFormat.parse(timeStr);
        return parseDate;
    }

    /**
     * 字符串转日期对象
     * @param timeStr
     * @return
     */
    public static Date parseDate(String timeStr) throws ParseException {
        return parseDate(timeStr, formatPattern);
    }

    /**
     * 两个日期对象相差秒
     * @return
     */
    public static long diffSecond(Date begin, Date end){
        long diffMillisecond = end.getTime() - begin.getTime();
        return diffMillisecond / 1000L;
    }

    /**
     * 判断日期在两个日期之间
     * @param begin 开始日期
     * @param mid 判断的日期
     * @param end 结束日期
     * @return 是否存在俩日期之间
     */
    public static boolean betweenDays(Date begin, Date mid, Date end){
        if(mid.getTime() >= begin.getTime() && mid.getTime() < end.getTime()){
            return true;
        }

        return false;
    }

    /**
     * 获取当前日期之前或之后的指定天数的日期
     * @param num 指定天数
     * @return 指定天数之前或之后的日期
     */
    public static Date getBeforeOrAfterDay(int num) {
        Calendar c = Calendar.getInstance();
        c.add(Calendar.DAY_OF_MONTH, num);
        return c.getTime();
    }

}
